Онлайн-справочник по самым часто задаваемым вопросам из темы "Как сделать?" на форуме QSP.su

< Назад, к странице 176
Вперёд, к странице 178 >

Зарезервированные слова, системные переменные и спецсимволы

Функции

$CURACTS

$CURACTS — данная функция возвращает выведенные на экран действия в виде кода QSP, как текстовое значение.

Действия сохраняются как набор операторов act с cответствующими параметрами и операциями.

Записав возвращённое функцией значение в переменную, можно восстановить действия с помощью оператора dynamic. Пример:

        ! записываем текущие действия в переменную
        $actlist=$curacts
        ! восстанавливаем действия из переменной
        dynamic $actlist

$CURLOC

$CURLOC — функция возвращает название текущей локации, т.е. локации, в которой "находится" игрок.

Технически это следует понимать так. В момент запуска игры плеер начинает выполнять код самой первой локации в игре, а когда код выполнен, плеер "останавливается" и ждёт участия игрока. Игрок может нажимать различные кнопки в игре, ссылки и выбирать пункты меню, что приводит к выполнению других блоков кода (например, действий) и переходам на новые локации по goto или xgoto. При таких переходах плеер вновь выполняет код других локаций и, когда код выполнен, "останавливается".

Так вот, когда на локацию осуществлён непосредственный переход (т.е. по goto или xgoto, либо это самая первая локация в игре), $curloc начинает возвращать название этой локации, — во всё время, пока выполняется код, и когда плеер "останавливается". Если после остановки не происходит переход по `goto/'xgoto, значение, которое возвращает $curloc`, не меняется.

Пример использования:

        act "— Где я нахожусь?": *pl "Это "+$curloc+"."

$DESC

$DESC — возвращает текст базового описания локации с заданным названием. Общая запись:

        $DESC([$локация])

, где [$локация] — это название интересующей нас локации. Например:

        ! возвращаем базовое описание локации "каморка_под_лестницей"
        $desc('каморка_под_лестницей')
        !возвращаем базовое описание текущей локации
        $desc($curloc)

$DYNEVAL (DYNEVAL)

DYNEVAL — выполняет код, переданный в виде строки текста, и возвращает результат, если он есть. Общая запись:

        $DYNEVAL([$код],[аргумент 0],[аргумент 1], ... ,[аргумент 8])
        DYNEVAL([$код],[аргумент 0],[аргумент 1], ... ,[аргумент 8])

, где [$код] — это обычный код QSP, записанный в виде текста. Выполнение такого кода аналогично выполнению кода функции FUNC. Аргументы [аргумент 0], [аргумент 1] и т.д. могут использоваться внутри [$код], их значения автоматически помещаются в переменные args[0], args[1], и т.д. соответственно.

Чтобы dyneval возвращала результат, необходимо внутри [$код] присвоить этот результат переменной result.

Примеры:

        dyneval('result = 3+4')
        *pl $dyneval('$result = mid("abcd",2,1)+"qwerty"')
        проход=dyneval("result = ($args[0] <> 'текст')", 'строка')

Результат функции равен значению $result при возврате строкового значения или result при возврате числового значения. если при выполнении кода были установлены и result, и $result, то предпочтение отдаётся строковому значению. После выполнения кода предыдущие значения args и result восстанавливаются, затем продолжается выполнение кода после dyneval.

Внимание: при использовании в коде [$код] операторов `gs/'dynamic переменные result и $result` могут перезаписываться кодом, выполняемым этими операторами (исправлено в более новых версиях интерпретатора >5.7.0).

См. также оператор DYNAMIC.

$FUNC (FUNC)

FUNC — выполнение кода указанной локации без непосредственного перехода на неё с возвращением значения.

Общая запись:

        FUNC([$локация],[аргумент 0],[аргумент 1], ... ,[аргумент 8])
        $FUNC([$локация],[аргумент 0],[аргумент 1], ... ,[аргумент 8])

, где [$локация] — это название локации, код которой мы хотим выполнить без непосредственного перехода на неё. Аргументы [аргумент 0], [аргумент 1] и т.д. могут использоваться на этой локации, их значения автоматически помещаются в переменные args[0], args[1], и т.д. соответственно.

Базовое описание и список действий локации [$локация] добавляются к основному описанию и действиям старой локации. Так же происходит выполнение операторов в поле "Выполнить при посещении"

Результат функции равен значению $RESULT при возврате строкового значения или RESULT при возврате числового значения. Если при обработке локации были установлены и RESULT, и $RESULT, то предпочтение отдаётся строковому значению. После обработки локации предыдущие значения ARGS и RESULT восстанавливаются.

Внимание: при использовании в коде [$код] операторов `GS/'DYNAMIC` переменные RESULT и $RESULT` могут перезаписываться кодом, выполняемым этими операторами (исправлено в более новых версиях интерпретатора >5.7.0).

Примеры:

        !Обработка локации "функция" как функции. 
        !Массив ARGS пуст.
        яблоки = FUNC('функция')
         
        !обработка локации с названием лежащим в переменной $name как функции. ARGS[0] равен 1.
        pl func($name, 1) * 78
         
        !обработка локации с названием в $name как функции. 
        !$ARGS[0] содержит строку "строка", ARGS[1] равен 2.
        msg "text" + func($name, "строка", 2)

        ! код локации для функции, получающей сумму ряда чисел от единицы до указанного значения
        !# summ
        ! в args[0] будет помещено число, которое мы укажем в качестве [аргумента 0]
        :for
        if args[0]>0:
            result=result+args[0]
            args[0]=args[0]-1
            jump 'for'
        end
        !-----summ-----

        ! пример вызова локации "summ", как функции
        *pl func("summ",19) & ! выведет на экран 190
        ! пример вызова с записью названия локации в переменную
        $name_loc="summ"
        *pl func("summ",23) & ! выведет на экран 276

$GETOBJ

$GETOBJ — возвращает название предмета в рюкзаке, расположенного в заданной позиции. Общая запись:

        $GETOBJ([номер предмета])

Индексация (нумерация) предметов рюкзака ведётся с 1. Если предмета с индексом [номер предмета] не существует, возвращается пустая строка ('').

Примеры:

        $getobj(1) & ! вернёт название первого предмета в рюкзаке

        $getobj(countobj) & ! вернёт название последнего добавленного предмета

Код, подсчитывающий в массиве OBJECTS число предметов с одинаковым названием:

        i = 1
        :loop
        if i<=countobj:
            objects[$getobj(i)] = objects[$getobj(i)] + 1
            i = i + 1
            jump 'loop'
        end

$IIF (IIF)

IIF — возвращает значение в зависимости от верности выражения.

Общая запись:

        IIF([#выражение],[#выражение_да],[#выражение_нет])
        $IIF([#выражение],[$выражение_да],[$выражение_нет])

Если [#выражение] верно, возвращает значение выражения [выражение_да], в противном случае возвращает значение выражения [выражение_нет]. При выполнении функции вычисляются значения всех трёх выражений.

Примеры:

        !Модуль числа
        abs_x=iif>(x>0,x,-x)
 
        !А следующая конструкция вызовет ошибку деления на ноль:
        x=0
        y=iif(x=0,0,1/x)

        ! типичное решение для вывода времени, чтобы не терять ноль на часах:
        $iif(hour>9,$str(hour),"0"+$str(hour))+":"+$iif(minute>9,$str(minute),"0"+$str(minute))

$INPUT

$INPUT — возвращает интерпретатору введённый игроком текст, либо '' (пустая строка), если была нажата кнопка "Отмена". Общая запись:

        $INPUT([$текст])

, где [$текст] — это приглашение в диалоговом окне, которое видит игрок. Например:

        $name = $input('Как звать тебя, герой?')

При выполнении данной команды на экране появится диалоговое окно с текстом "Как звать тебя, герой?", а выполнение остального кода приостановится, пока игрок не провзаимодействует с диалоговым окном.

Игрок может ввести или не ввести текст, и нажать кнопку "ОК" или "Отмена". Если игрок ввёл текст и нажал кнопку "ОК", функция $input вернёт переменной $text введённый игроком текст. Во всех остальных случаях после закрытия диалогового окна функция вернёт пустую строку ('').

Другие примеры:

    ! Вопрос с одним правильным ответом. 
    if $input('Что приходит после тьмы?')='свет':
        msg 'Все верно.'
    else
        msg 'Ответ не верный.'
    end

    ! Пример реализации вопроса с несколькими вариантами ответа из которых любой будет правильным.
    $answer =$trim($lcase($input('Ответить')))
    if instr($answer,'красный') or instr($answer,'желтый') or instr($answer,'зеленый'): gt 'win'
    ! Введя красный или зеленый ил желтый произойдет переход на локацию 'win'

Допустимо, но не одобряется, использовать функцию для возвращения числовых значений:

        INPUT([$приглашение])

Это может привести к различным ошибкам в игре, если игрок введёт в диалоговом окне не только цифры. Например:

        age=input('Сколько вам лет?')

Если игрок введёт вместо числа строку "24 года", плеер выдаст ошибку 101 "Несоответствие типов данных". Подобные ситуации должен предусматривать автор игры, а значит правильно будет озаботиться проверкой введённого значения уже после того, как функция $input будет выполнена.

        :enter_text
        ! предлагаем игроку ответить на вопрос
        ! и присваиваем введённый текст переменной
        $text=$input('Сколько вам лет?')
        ! если во введённом тексте содержатся не только цифры
        ! либо игрок не ввёл ответ
        if isnum($text)<>-1 or $text="":
            ! предлагаем игроку снова ответить на вопрос
            jump 'enter_text'
        else
            age=val($text)
        end

$LCASE

$LCASE — возвращает строку маленьких букв, полученную изменением регистра букв исходной строки. Общая запись:

        $LCASE([$текст])

, где [$текст] — любая строка текста.

Примеры:

        $lcase('TExT#') & ! вернёт 'text#'
        $lcase('Привет, Алиса!') & ! вернёт 'привет, алиса!'
        $lcase('Я НЕ ХОЧУ НА ВАС ОРАТЬ.') & ! вернёт 'я не хочу на вас орать.'

$MAINTXT

$MAINTXT — возвращает текст, выведенный в окно основного описания.

Данная функция может быть полезна для замены части текста в окне основного описания, либо иной обработке текста. Пример:

        ! изначально мы вывели строку
        *pl "Мы вывели на экран строку и в этой строке есть кусок, который мы хотим удалить."

        ! получаем текст из окна основного описания
        $text=$maintxt
        ! вырезаем лишний кусок
        $text_new=$replace($text," и в этой строке есть кусок, который мы хотим удалить")
        ! очищаем окно основного описания
        *clr
        ! выводим новый текст
        *p $text_new

$MAX (MAX)

MAX — возвращает максимальное из значений выражений-аргументов. Можно передавать от одного до девяти значений/аргументов. Если передан один аргумент, то считается, что указано имя массива. Общая запись:

        MAX([#выражение 1],[#выражение 2], ... ,[#выражение 10])
        $MAX([$выражение 1],[$выражение 2], ... ,[$выражение 10])

        MAX([$название массива])
        $MAX([$название массива])

Обратите внимание, при передаче одного аргумента поиск максимального элемента происходит среди строковых (если название массива указано со знаком $) или среди числовых значений элементов массива. Например:

        max('a') & ! вернёт максимальное из числовых значений элементов массива "a"
        $max('$b') & ! вернёт максимальное из строковых значений элементов массива "b"

Нельзя писать так и надеяться, что произойдёт поиск среди значений массива a:

        max(a)

Можно так:

        $b='a'
        max($b) & ! произойдёт поиск максимального значения среди элементов массива "a"

Другие примеры:

        max(1,2,5,2,0) &! вернёт 5
        max(a,b,c) &! вернёт максимальное из значений переменных a,b,c
        $max('aa','ab','zz') &! вернёт 'zz'

$MID

$MID — позволяет вырезать из строки её часть. Общая запись:

        $MID([$строка],[#начало],[#длина])

, где [$строка] — это строка текста, именно из неё функция вырезает часть, начиная с символа номер [#начало], и длиной в [#длина] символов. Нумерация символов начинается с 1. Если отсутствует параметр [#длина], вырезается часть до конца строки. Параметр [#начало] обязателен, и может в принципе принимать любые значения.

        $mid('abcdef',1,2)    &    ! 'ab'
        $mid('abcdef',2,3)    &    ! 'bcd'
        $mid('abcdef',2)    &    ! 'bcdef'
        $mid('abcdef')        &    ! 'ошибка [120] — неверное число аргументов оператора/функции'
        $mid('abcdef',0)    &    ! 'abcdef'
        $mid('abcdef',8)    &    ! ''

$MIN (MIN)

MIN — возвращает минимальное из значений выражений-аргументов. Можно передавать от одного до девяти значений/аргументов. Если передан один аргумент, то считается, что указано имя массива. Общая запись:

        MIN([#выражение 1],[#выражение 2], ... ,[#выражение 10])
        $MIN([$выражение 1],[$выражение 2], ... ,[$выражение 10])
        MIN([$название массива])
        $MIN([$название массива])

Обратите внимание, при передаче одного аргумента поиск минимального элемента происходит среди строковых (если название массива указано со знаком $) или среди числовых значений элементов массива. Например:

        min('a')    & ! вернёт минимальное из числовых значений элементов массива "a"
        $min('$b')    & ! вернёт минимальное из строковых значений элементов массива "b"

Нельзя писать так:

        min(a)

Можно так:

        $b='a'
        min($b) & ! произойдёт поиск максимального значения среди элементов массива "a"

Другие примеры:

        min(1,2,5,2,0)    &    ! вернёт 0
        min(a,b,c)        &    ! вернёт минимальное из значений переменных a,b,c
        $min('aa','ab','zz') & ! вернёт 'aa'

$QSPVER

$QSPVER - возвращает версию интерпретатора в формате "X.Y.Z". Пример вызова:

        if $qspver<"5.7.0": *pl "Ваша версия плеера не подходит для этой игры. Установите плеер версии 5.7.0 или выше."

$REPLACE

$REPLACE — общая запись:

        $REPLACE([$строка],[$поиск],[$замена])

Данная функция заменяет в строке [$строка] все вхождения строки [$поиск] строкой [$замена] и возвращает результат. Если [$замена] отсутствует или указана пустая строка, то удаляет в исходной строке все вхождения искомой строки. Примеры:

        $replace('test', '12', '4')    & ! выведет на экран 'test'
        $replace('test', 'e', 's')    & ! выведет на экран 'tsst'
        $replace('test', 't', '34')    & ! выведет на экран '34es34'
        $replace('test', 't')        & ! выведет на экран 'es'
        ! можно присвоить значение переменной
        $text="Строка текста с разными буквами."
        ! а новое значение вписать в другую переменную
        $text_new=$replace($text,"ст","st")
        *pl $text
        *pl $text_new

$SELACT

$SELACT — возвращает название выделенного действия в любом месте игры.

Следует помнить, что выделение действия происходит при наведении на него указателя мыши, а не при непосредственном нажатии.

Пример использования можно посмотреть в разделе $onactsel

$SELOBJ

$SELOBJ — возвращает название выделенного предмета в любом месте игры. Выделение предмета происходит в момент нажатия (щелчка мышью по предмету) и не снимается до применения команды unselect.

Пример использования можно посмотреть в разделе $onobjsel

$STATTXT

$STATTXT — возвращает текст, выведенный в окно дополнительного описания. Может быть полезна для замены части текста в окне дополнительного описания.

$STR

$STR — возвращает строку текста, полученную переводом числа в строку. Общая запись:

        $STR([#число])

Пример:

        $str(56) & ! превратит число 56 в строку "56" и выведет на экран

$STRFIND

$STRFIND — возвращает подстроку, соответствующую регулярному выражению, из указанной строки. Общая запись:

        $STRFIND([$строка],[$шаблон],[#номер])

, где [$строка] — исходная строка, в которой производим поиск вхождения, соответствующего регулярному выражению [$шаблон], или группе номер [#номер] в регулярном выражении. Если подстрока с указанным номером отсутствует, то возвращается пустая строка. Нумерация групп подстрок начинается с 1. Если параметр [#номер] отсутствует или равен 0, то возвращается подстрока, соответствующая всему регулярному выражению [$шаблон]

Например, возьмём регулярное выражение:

        '^(\S+)\s(\S+)\s(\S+)$'

Метасимвол \S означает любой непробельный символ, а квантификатор + указывает, что непробельные символы должны присутствовать один или более раз. Таким образом запись \S+ можно условно сопоставить слову. Каждое слово с помощью скобок () выделено в отдельную группу, а между группами присутствуют пробельные символы \s. Метасимволы ^ и $ означают соответственно начало и конец строки. Таким образом наше регулярное выражение соответствует любой строке из трёх слов, разделённых пробелами.

Тогда:

        ! в этом случае строка не соответствует регулярному выражению
        ! потому что согласно регулярному выражению строка должна начинаться
        ! с группы непробельных символов. Команда вернёт пустую строку ''
        $strfind(' идти к пещере','^(\S+)\s(\S+)\s(\S+)$')
        ! в данном случае строка полностью соответствует регулярному выражению
        ! а значит команда вернёт строку полностью 'идти к пещере'
        $strfind('идти к пещере','^(\S+)\s(\S+)\s(\S+)$')=''
        ! в следующих трёх примерах строка соответствует регулярному выражению
        ! однако третий аргумент указывает, какую именно группу из этого
        ! регулярного выражения мы хотим получить, поэтому каждая команда вернёт
        ! соответственно первое, второе и третье слова из строки
        $strfind('идти к пещере','^(\S+)\s(\S+)\s(\S+)$',1) & ! вернёт 'идти'
        $strfind('идти к пещере','^(\S+)\s(\S+)\s(\S+)$',2) & ! вернёт 'к'
        $strfind('идти к пещере','^(\S+)\s(\S+)\s(\S+)$',3) & ! вернёт 'пещере'
        ! здесь последняя группа непробельных символов объединена в одну
        ! группу с последним пробельным символом. Квантификатор "?" указывает,
        ! что эта группа может как присутствовать в строке, так и отсутствовать:
        $strfind('идти к пещере','^(\S+)\s(\S+)(\s(\S+))?$',4) & ! вернёт 'пещере'
        $strfind('идти к пещере','^(\S+)\s(\S+)(\s(\S+))?$',3) & ! вернёт ' пещере'
        ! этому же регулярному выражению соответствует и такая строка
        $strfind('искать ключ','^(\S+)\s(\S+)(\s(\S+))?$',1) & ! вернёт 'искать'
        ! а вот эта строка уже не соответствует регулярному выражению
        $strfind('искать','^(\S+)\s(\S+)(\s(\S+))?$',1) & ! вернёт ''

Следующие примеры показывают, как $strfind возвращает часть строки, соответствующую регулярному выражению:

        $strfind('идти к дому','к\s(\S+)') & ! вернёт 'к дому'
        $strfind('идти к дому', 'к\s(\S+)', 1) & ! вернёт 'дому'
        $strfind('идти к своему дому','к\s(\S+)',1) & ! вернёт 'своему'

$TRIM

$TRIM — возвращает указанную строку без прилегающих символов табуляции и пробелов. Общая запись:

        $TRIM([$выражение])

Например:

        $trim('     trim test        ') & ! вернёт 'trim test'

$UCASE

$UCASE — возвращает строку больших букв, полученную изменением регистра букв исходной строки. Общая запись:

        $UCASE([$текст])

, где [$текст] — любая строка текста.

Примеры:

        $Ucase('TExT#') & ! вернёт 'TEXT#'
        $Ucase('Привет, Алиса!') & ! вернёт 'ПРИВЕТ, АЛИСА!'
        $Ucase('Я хочу на вас орать.') & ! вернёт 'Я ХОЧУ НА ВАС ОРАТЬ.'

$USER_TEXT ($USRTXT)

$USER_TEXT — в любом месте игры возвращает текст, который находится в строке ввода (поле ввода). Имеет краткую форму $usrtxt. Пример смотри в разделе $usercom.

ARRCOMP

ARRCOMP — возвращает индекс элемента массива, соответствующего регулярному выражению. Поиск начинается с элемента с заданным номером; индексация элементов массива ведётся с нуля. Если указанное значение не найдено, функция возвращает -1. Общая запись:

        ARRCOMP([#начало],[$имя_массива],[$шаблон])

, где [#начало] — номер элемента массива, с которого следует начать поиск, [$имя_массива] — название массива, по которому нужно произвести поиск, [$шаблон] — регулярное выражение, с которым будет сравниваться искомый элемент.

Параметр [#начало] может отсутствовать, при этом его значение принимается равным 0. Поиск ведётся только среди текстовых элементов массива.

Важно! В более новых версиях плеера (например, в Quest Navigator) параметр [#начало] переставлен в конец:

        ARRCOMP([$имя_массива],[$шаблон],[#начало])

Для примера возьмём вот такой массив:

        $mass[0]="топаю вперёд"
        $mass[1]=" иду в пещеру"
        $mass[2]="не иду в пещеру"
        $mass[3]="топаю к дому"

Нам нужно найти элемент, значение которого состояит из трёх слов. В грубом приближении слово — это набор из одного или более непробельных символов \S+, по бокам от которого могут стоять или не стоять символы пробела \s, отсюда мы можем составить вот такое регулярное выражение:

    \s?\S+\s\S+\s\S+\s?

Остаётся только выяснить какой элемент массива соответсвует шаблону:

        arrcomp('$mass','\s?\S+\s\S+\s\S+\s?') & ! этому выражению соответствует первый элемент

Если мы хотим проигнорировать первый элемент и начать поиск со второго:

        arrcomp(2,'$mass','\s?\S+\s\S+\s\S+\s?') & ! этому выражению соответствует третий элемент

А вот так мы можем вывести на экран значения всех элементов, содержащих слово "иду":

        pos=0
        :for
        index=arrcomp(pos,'$mass','(.*\s|^)иду(\s.*|$)')
        if index<>-1:
            $mass[index]
            pos=index+1
            jump 'for'
        end

Другие примеры:

        ! Поиск строки 'This' среди элементов массива "$A"
        arrcomp(0,'$A','This')
        ! Поиск строки, соответствующей регулярному выражению "abc\d+"
        ! (первые два элемента массива игнорируются)
        arrcomp(2,'$A','abc\d+')
        ! аналогично предыдущему примеру,
        ! но поиск осуществляется по всем элементам массива
        arrcomp(0,'$A','.*string.*') 
         
        arrcomp('$A','This') & ! эквивалентно 1му варианту

ARRPOS

ARRPOS — возвращает индекс элемента массива, равного указанному значению. Поиск начинается с элемента с заданным номером; индексация элементов массива ведётся с нуля. Если указанное значение не найдено, функция возвращает -1. Общая запись:

        ARRPOS([#начало],[$имя_массива],[значение])

, где [#начало] — номер элемента массива, с которого следует начать поиск, [$имя_массива] — название массива, по которому нужно произвести поиск, [значение] — число, или строка (в зависимости от типа массива), которое нужно найти в массиве.

Важно! В более новых версиях плеера (например, в Quest Navigator) параметр [#начало] переставлен в конец:

        ARRPOS([$имя_массива],[$шаблон],[#начало])

Для примера возьмём такой массив:

        $color[0]='красный'
        $color[1]='жёлтый'
        $color[2]='зелёный'
        $color[3]='синий'
        $color[4]='жёлтый'

Нам нужно найти элемент со значением "жёлтый":

        arrpos('$color','жёлтый') & ! вернёт значение 1

Если мы хотим проигнорировать первые два элемента:

        arrpos(2,'$color','жёлтый') & ! вернёт значение 4

Если мы хотим найти элемент со значением, которого нет в массиве:

        arrpos('$color','голубой') & ! вернёт значение -1

Другие примеры:

        ! поиск строки 'this' в текстовом массиве "$a"
        arrpos(0,'$a','this')
        ! поиск числа 65 в массиве "a" (два элемента массива игнорируются)
        arrpos(2,'a',65)
        ! поиск строки 'test' среди значений массива "$b"
        arrpos('$b','test')

ARRSIZE

ARRSIZE — функция возвращает число элементов массива. Общая запись:

        ARRSIZE([$имя_массива])

, где [$имя_массива] — название массива, размер которого хотим получить.

В силу особенностей движка плеера, не важно, указывается ли название текстового, или числового, массива, возвращено будет наибольшее значение. Для примера:

        $a[0]='0'
        $a[1]='1'
        a[0]=1
        a[1]=2
        a[2]=3

        arrsize('$a')    & ! вернёт значение 3
        arrsize('a')    & ! вернёт значение 3

        $b[0]='0'
        $b[1]='1'
        $b[2]='2'
        b[0]=1
        b[1]=2

        arrsize('$b')    & ! вернёт значение 3
        arrsize('b')    & ! вернёт значение 3

COUNTOBJ

COUNTOBJ — возвращает количество предметов в инвентаре.

Номер последнего предмета в списке численно совпадает с количеством предметов, поэтому всегда можно получить название последнего предмета так:

        $getobj(countobj)

INSTR

INSTR — возвращает номер символа, с которого начинается вхождение подстроки в строку. Общая запись:

        INSTR([#начало],[$строка],[$подстрока])

, где [#начало] — это номер символа, с которого нужно начинать поиск, [$строка] — это текстовое значение (строка), по которому нужно производить поиск, а [$подстрока] — значение, которое мы ищем в указанной строке. Нумерация символов начианется с 1. Параметр [#начало] может отсутствовать, при этом он принимается равным 1.

Примеры:

        instr(3,'abcdefabcdef','bc')    & ! вернёт число 8
        instr('abcdefghijklm','abc')    & ! вернёт число 1

Если ни одного вхождения указанной подстроки в строке нет, instr возвращает 0.

Пример:

        instr('Вася вышел из дома.','идти') & ! вернёт 0

Важно: в более новых версиях (Quest Navigator) необязательный параметр [#начало] переставлен в конец:

        INSTR([$строка],[$подстрока],[#начало])

ISNUM

ISNUM — функция возвращает -1 (истина), если переданная строка является числом, и — 0, если строка не является числом. Общая запись:

        ISNUM([$строка])

, где [$строка] — любая строка текста.

При проверке учитываются знак - в начале, прилегающие пробелы и символы табуляции, но кроме того, если хотя бы один символ окажется не цифрой, функция вернёт 0 (ложь).

Примеры:

        isnum(' 9999 ') & ! вернёт -1
        isnum(' -888')  & ! вернёт -1
        isnum('777a6')  & ! вернёт 0
        isnum('')       & ! вернёт -1, так как нет ни одной не-цифры (пустая строка считается нулём)

ISPLAY

ISPLAY — функция проверяет, проигрывается ли в данный момент файл с указанным названием, и если проигрывается, возвращает -1. В противном случае функция возвращает 0. Общая запись:

        ISPLAY([$путь_к_файлу])

, где [$путь_к_файлу] — путь к звуковому файлу относительно файла игры.

Пример:

        isplay('music/mountsound.mp3')

LEN

LEN — возвращает длину указанной строки текста (количество символов). Общая запись:

        LEN([$текст])

, где [$текст] — любое текстовое значение.

Примеры:

        len("abc") & ! вернёт значение 3
        len("тысячадевятьсотвосьмидесятидевятимиллиметровый") & ! вернёт значение 46
        len("") & ! вернёт значение 0

MSECSCOUNT

MSECSCOUNT — возвращает количество миллисекунд, прошедших с момента начала игры. Данная функция при использовании на локации-счётчике позволяет организовывать различные события, происходящие в реальном времени. Так же, с помощью этой функции можно делать замеры быстродействия различных участков кода в вашей игре:

        i=0
        old_time=msecscount
        :for
        if i<100000:
            a[i]=i
            i+=1
            jump 'for'
        end
        new_time=msecscount
        pl new_time-old_time

RAND

RAND — возвращает случайное число между двумя указанными числами. Общая запись:

        RAND([#выражение 1],[#выражение 2])

, где [#выражение 1] и [#выражение 2] — два любых числа или числовых выражения. Параметр [#выражение 2] может отсутствовать, при этом он принимается равным нулю (в более новых версиях плеера, например Quest Navigator, данный параметр по умолчанию равен единице).

Примеры:

        rand(1,4) &! вернёт случайное значение от 1 до 4
        rand(4,1) &! вернёт случайное значение от 1 до 4
        rand(1000) &! вернёт случайное значение от 0(1) до 1000
        rand 1000 &! вернёт случайное значение от 0(1) до 1000

RGB

RGB — возвращает числовой код цвета на основе трёх числовых аргумнтов, каждый из которых соответствует составляющей требуемого цвета. Общая запись:

        RGB([#красный],[#зелёный],[#синий])

, где [#красный],[#зелёный] и [#синий] — числовое выражение трёх составляющих цвета соответсвенно красной, зелёной и синей; должны принимать значения от 0 до 255.

Данная функция обычно используется совместно с системными переменными bcolor, fcolor, lcolor. Пример:

        ! гиперссылки светло-жёлтого цвета
        lcolor=rgb(255,255,100)
        ! фон тёмно-серого цвета
        bcolor=rgb(25,25,25)
        ! текст светло-зелёного цвета
        fcolor=rgb(100,255,100)

RND

RND - возвращает случайное значение от 1 до 1000. Аналогично команде:

        rand(1,1000)

STRCOMP

STRCOMP — проводит сравнение строки с регулярным выражением и, если строка соответствует регулярному выражению, возвращает -1 (истина), а если не соответствует — 0 (ложь). Общая запись:

        STRCOMP([$строка],[$шаблон])

, где [$строка] — любое текстовое значение, [$шаблон] — регулярное выражение, с которым производится сравнение.

Например, нам нужно проверить, состоит ли указанная строка из трёх слов. Каждое слово, в грубом виде, это набор непробельных символов, значит мы можем воспользоваться метасимволом \S и квантификатором +. Слова обычно разделены проблеьными символами, для чего мы используем метасимвол \s. Получается вот такое регулярное выражение:

        "\s?\S+\s+\S+\s+\S+\s?"

Теперь мы можем проверить, какие строки соответствуют этому регулярному выражению:

        strcomp('иду по дороге','\s?\S+\s+\S+\s+\S+\s?') & ! вернёт -1
        strcomp(' иду домой','\s?\S+\s+\S+\s+\S+\s?') & ! вернёт 0
        strcomp(' иду в лес ','\s?\S+\s+\S+\s+\S+\s?') & ! вернёт -1
        strcomp('однословие','\s?\S+\s+\S+\s+\S+\s?') & ! вернёт 0

STRPOS

STRPOS — возвращает позицию символа, с которого начинается вхождение подстроки, соответствующей регулярному выражению, в указанную строку. Общая запись:

        STRPOS([$строка],[$шаблон],[#номер])

, где [$строка] — исходная строка, в которой производим поиск вхождения, соответствующего регулярному выражению [$шаблон], или группе номер [#номер] в регулярном выражении. Нумерация групп в регулярном выражении начинается с 1. Если подстрока с указанным номером отсутствует, то возвращается 0.

Если параметр [#номер] отсутствует или равен 0, то возвращается позиция символа, с которого начинается вхождение подстроки, соответствующей всему регулярному выражению.

Например, нам нужно выяснить, в какой части текста встречается словосочетание "зелёное яблоко", однако при этом не должно быть важно, в каком падеже записано это прилагательное.

Чтобы написать регулярное выражение для этой задачи, нам нужно предусмотреть все падежи:

        зелёное яблоко
        зелёного яблока
        зелёному яблоку
        зелёное яблоко
        зелёным яблоком
        зелёном яблоке

Как видим, во всех формах меняются только окончания слов. Поэтому мы можем составить вот такое регулярное выражение:

        "зелён(ое|ого|ому|ым|ом)\s+яблок(о|а|у|ом|е)"

Через прямую черту в скобках перечисленны возможные варианты окончаний. А теперь выясним, с какого символа в строке начинается возможное слвовосочетание "зелёное яблоко":

        ! для удобства регулярное выражение помещаем в переменную
        $regexp="зелён(ое|ого|ому|ым|ом)\s+яблок(о|а|у|ом|е)"
        strpos("У меня есть зелёное яблоко",$regexp) & ! вернёт 13
        strpos("Ты швырнул в него зелёным яблоком!",$regexp) & ! вернёт 19
        strpos("полный ящик зелёных яблок",$regexp) & ! вернёт 0, потому что такую форму мы не учли

Если мы не просто хотим узнать, с какого символа начинается вхождение в строку словосочетания, но где начинается вхождение слово "яблоко" из этого словосочетания, нам нужно выделить слово "яблоко" с вариантами окончаний в отдельную группу и воспользоваться параметром [#номер]:

        $regexp="зелён(ое|ого|ому|ым|ом)\s+(яблок(о|а|у|ом|е))"
        strpos("У меня есть зелёное яблоко",$regexp,2) & ! вернёт 21
        strpos("Ты швырнул в него зелёным яблоком!",$regexp,2) & ! вернёт 27
        strpos("полный ящик зелёных яблок",$regexp,2) & ! вернёт 0, потому что мы не учли форму

VAL

VAL — переводит указанную строку цифр в соответствующее число. Общая запись:

        VAL([$выражение])

, где [$выражение] — любая строка текста.

При проверке учитываются знак - в начале, прилегающие пробелы и символы табуляции, но кроме того, если хотя бы один символ окажется не цифрой, функция вернёт 0. Так же если [$выражение] равно '' (пустая строка), то возвращается 0.

Пример:

        яблоки=val($яблоки)
< Назад, к странице 176
Вперёд, к странице 178 >

Aleks Versus'HowDo-F.A.Q.'2021-2022

Aleks Versus'Game Adventure Making'Really Unimaginable Stories'2013-2022

 

Содержание

1. В чём разница?

1.1. В чём разница между set x=10, let x=10 и x=10?

1.2. В чём разница между переменной со знаком $ и без знака $?

1.3. В чём разница между ' ' (апострофы) и " " (кавычки)?

1.4. В чём разница между *pl "строка" и просто " строка" ?

1.5. Чем отличаются эти две команды? *pl "<<$perem>>" и *pl $perem

1.6. В чём разница между dynamic и dyneval?

1.7. В чём разница между gt и goto?

1.8. Чем отличается goto от gosub?

18.1. Чем отличаются команды addqst и openqst?

Источники и дополнительные материалы

2. Вопросы о $COUNTER

2.1. Как сделать, чтобы значение переменной изменялось с течением времени?

2.2. Как сделать, чтобы из одной локации меня через пару секунд перебрасывало в другую локацию?

2.3. Как сделать, чтобы через пару секунд после входа на локацию появлялось новое действие?

2.4. Как сделать, чтобы цикл выполнялся параллельно остальному коду, а не прерывал его?

Источники и дополнительные материалы

3. Вопросы о MSG и $INPUT

3.1. Как вывести на экран отдельное окошко с текстом? | Подскажите аналог команды alert в QSP.

3.2. Как вывести на экран окошко, в котором игрок должен ввести текст? | Подскажите аналог команды prompt в QSP.

3.3. Как прикрутить возможность выбора варианта к окну msg? | Подскажите аналог команды confirm в QSP.

3.4. Как сделать ввод имени игроком?

3.5. Как увеличить число правильных ответов, которые может ввести игрок? | Как сделать варианты для ответа через $input?

Источники и дополнительные материалы

4. Вопросы о меню

4.1. Как сделать меню предмета?

4.2. Как сделать разные меню для двух и более предметов?

4.3. Как сделать меню в ссылках?

4.4. Как передавать локациям-пунктам меню аргументы?

4.5. Как делать контекстное (динамическое) меню?

4.6. Как вставить разделитель в меню?

4.7. Как вставить картинки в меню?

Источники и дополнительные материалы

5. Вопросы по $ONNEWLOC

5.1. Как сделать так, чтобы не писать один и тот же код в каждой локации?

5.2. Как сделать кнопку "Назад", работающую на каждой локации?

5.3. Почему в args на локации-обработчике перехода на новую локацию уже есть данные?

Источники и дополнительные материалы

6. Вопросы по звуковым файлам в QSP

6.1. Как вставить музыку или звук в игру?

6.2. Как запустить две звуковые дорожки?

6.3. Как при переходе на новую локацию прервать одну мелодию и запустить другую?

6.4. Как перезапустить звуковую дорожку?

6.5. Как приглушить музыку?

6.6. Как зациклить мелодию?

Источники и дополнительные материалы

7. Вопросы о гиперссылках

7.1. Как делать гиперссылки, по нажатию на которые выполняется код? | Как делать кликабельный текст? | Как сделать, чтобы по нажатию на текст что-то происходило?

7.2. Как менять цвет гиперссылки?

7.3. Как помещать в гиперссылки сложный код?

7.4. Как сделать гиперссылки без подчёркивания?

Источники и дополнительные материалы

8. Есть ли команда...

8.1. Какой командой можно очистить окно дополнительного описания?

8.2. Существует ли команда для того, чтобы получить название текущей локации?

8.3. Какой командой можно вывести текст в окно дополнительного описания?

8.4. Есть ли команда, которая делает выход из игры?

Источники и дополнительные материалы

9. Вопросы о изображениях

9.1. Как вставить картинку в игру?

9.2. Можно ли вставить в игру gif-файл?

9.3. Как вставить картинку в действие?

9.4. Как поставить картинку фоном?

9.5. Как выводить изображения послойно? Накладывать друг на друга?

9.6. Как сделать кликабельное изображение? | Как сделать так, чтобы при щелчке по изображению выполнялись какие-то действия?

9.7. Как сделать сменяемое изображение на локации?

9.8. Как сделать вывод рандомного изображения?

Источники и дополнительные материалы

10. Интерфейс, дизайн, украшения

10.1. Для чего нужен оператор REFINT, и как он работает?

10.2. Как изменить цвет фона в игре?

10.3. Как изменить формат части текста? Размер, цвет, наклон и т.д.?

10.4. Как сделать красивый фон в классическом плеере?

10.5. Хочу, чтоб в игре окна располагались определённым образом. Как это сделать?

10.6. Можно ли задавать размер окон из кода игры? Чтобы в одной локации были одни настройки, в другой — другие.

10.7. Настроил расположение окна предпросмотра, но когда выключаю его, другие окна смещаются, как это исправить?

10.8. Как изменить цвет подсветки действий?

10.9. Как изменить цвет фона для отдельного окна?

10.10. Как сделать плавное появление текста? | Как сделать плавное изменение цвета фона? | Как сделать плавное изменение цвета текста?

10.11. Как использовать в игре собственный шрифт?

10.12. С предметов можно снимать выделение, а можно ли снять выделение с действия?

Источники и дополнительные материалы

11. Вопросы об условиях

11.1. При проверке условия записано просто число, без операции сравнения, но QSP не выдаёт ошибку. Почему?

11.2. Как сделать так, чтобы действие появлялось только при определённом условии?

11.3. Видел в одной из игр, как после нажатия на действие, оно становится неактивным. Как это сделать?

11.4. Как добавить текст, который будет выводиться только при выполнении определённого условия?

11.5. Как сделать, чтобы в диалоговом окне текст набирался в зависимости от условий? Чтобы при срабатывании одного или обоих условий текст в любом случае выводился? Логическое ИЛИ (OR).

11.6. Как упростить условие с логическим И (AND)?

11.7. Как упростить взаимоисключающие условия? Логическое XOR.

Источники и дополнительные материалы

12. Вопросы о DYNAMIC

12.1. Зачем нужен оператор dynamic?

12.2. Можно ли сделать переменную с рандомным (случайным) названием?

12.3. Создаю действия с помощью цикла, но они работают неправильно. Что делать?

12.4. Почему не работает dynamic?

Источники и дополнительные материалы

13. Не работает...

13.1. Рисую таблицу и хочу зафиксировать высоту, но атрибут height не работает.

13.2. Пытаюсь использовать разные HTML-теги в игре, но они не работают — просто не выводятся. Почему?

13.3. Не работает IIF!

13.4. Пытаюсь сделать кликабельную картинку с помощью тегов MAP и AREA, но ничего не получается. | Не выводится картинка, не работает область клика, область клика смещена.

13.5. Не работает *pl в действии с goto.

13.6. В AeroQSP не работает атрибут.

13.7. Не работает гиперссылка в AeroQSP.

13.8. Не работает оператор JUMP — не может найти метку.

13.9. Не работает многострочный код. Как исправить?

13.10. Не работает многострочный код. Как исправить?

13.11. Сколько END`ов нужно добавить?

13.12. Не работает условие. Как исправить? (if skrom>10 and <15)

13.13. Не работают десятичные дроби, дробные числа, числа с запятыми!

Источники и дополнительные материалы

14. Вопросы о предметах

14.1. Как добавить предмет в окно предметов?

14.2. Как удалить предмет из окна предметов?

14.3. Как удалить все предметы?

14.4. Как добавить предмет в определённую позицию в окне предметов?

14.5. Как заменить один предмет на другой?

14.6. Как делать динамические/считаемые предметы? | Как делать стакающиеся предметы? | Как делать предметы рядом с названиями которых выводится их количество?

14.7. Как добавить предмет с картинкой но без названия?

14.8. Как сделать, чтоб при щелчке по предмету выполнялся какой-либо код?

14.9. Как снять выделение предмета? | Как сделать, чтобы выбранный предмет можно было кликнуть ещё раз?

14.10. Как сделать два списка предметов? Например для игры за разных персонажей.

14.11. Как сделать, чтобы плеер выполнял определённый код при добавлении любого предмета?

14.12. Как сделать два разных предмета с одинаковыми названиями?

14.13. Как сделать многоуровневый рюкзак? | Как сделать предметы в предметах?

14.14. Можно ли выводить предметы не в окне предметов?

Источники и дополнительные материалы

15. Вопросы о строке ввода

15.1. Зачем вообще нужна строка ввода (поле ввода)?

15.2. Как задействовать строку ввода в игре?

Источники и дополнительные материалы

16. Вопросы по вёрстке

16.1. Можно ли писать текст поверх вставленной картинки (не бэкграунда)?

16.2. Возможно ли сделать плавный переход между локациями?

16.3. Как расположить картинку справа, а текст слева?

16.4. Как ограничить размер выводимого изображения?

16.5. Как сделать рамку окна основного описания? | Как сделать, чтобы картинки шли по контуру основного окна?

16.6. Как сделать вывод предметов магазина не длинным списком, а в виде таблицы?

16.7. Можно ли зеркально отразить картинку методами плеера? | Можно ли задать максимальную или минимальную ширину элементу? | Можно ли вычислить доступное место в основном окне?

16.8. Вывожу в окно табличку, а потом текст, но между текстом и табличкой возникают пустые строки. Что это и как этого избежать?

16.9. Можно как нибудь вывести текст в два столба в классике? К примеру характеристики персонажей.

16.10. Как работать с тегами MAP и AREA? Как разметить картинку на кликабельные зоны?

Источники и дополнительные материалы

17. Вопросы о сохранениях

17.1. Как запретить игроку самостоятельно сохранять игру?

17.2. Во время теста игры делал сохранения, затем внёс в игру несколько правок, но сохранения перестали загружаться. Почему так происходит, и что теперь делать?

17.3. Как сделать чекпойнты в игре?

17.4. Как написать действие, которое при каждом клике сохраняло бы игру в файлы "1.sav" и "2.sav" поочерёдно?

Источники и дополнительные материалы

18. Вопросы о файлах и модулях

18.1. Чем отличаются команды addqst и openqst?

18.2. Как сделать лаунчер?

18.3. Мне нужно узнать, есть ли в папке файл (картинка, музыка и т.д.). Как это сделать?

18.4. Перенёс файл игры из одной папки в другую. В Quest Generator пропали все папки. Почему так происходит, и как этого избежать?

18.5. В папке с игрой стали появляться файлы с расширением .tmp. Что это за файлы, нужны они, и как избавиться от их появления?

Источники и дополнительные материалы

19. Изыски

19.1. Как использовать ASCII-графику в QSP?

19.2. Как вставить в игру видео?

19.3. Как сделать так, чтобы текст появлялся на экране постепенно? По буквам?

19.4. Как защитить игру от чита?

19.5. Как задействовать клавиатуру в игре?

19.6. Как пропустить прохождение нескольких глав, чтобы протестировать вновь написанную главу и только её?

19.7. Как из под плеера выполнить произвольную строку кода?

19.8. Как узнать, на каком устройстве запущена игра? Телефон, компьютер, планшет?

19.9. Как обновлять переменные на экране?

19.10. Как сделать, чтобы текст выводился снизу вверх?

Источники и дополнительные материалы

20. Конкретные задачи

20.1. Как сделать возврат на предыдущую локацию?

20.2. Как проверить число на чётность?

20.3. Как сделать шанс на выпадение определённой вещи? Например 25 процентный шанс на то, что в сундуке окажется золотая чаша?

20.4. Как сделать, чтобы текст выводился не внизу окна основного описания, а сверху?

20.5. Как можно удалить часть текста из описания?

20.6. Как вывести на экран HTML-разметку, не отключая режим распознавания HTML? То есть при usehtml=1.

20.7. Есть несколько переменных с разными значениями. Как получить имя переменной, в которой находится наибольшее значение?

20.8. Как в QSP сравнить два массива?

20.9. Как сделать вытягивание случайных карт из колоды? Карты вытягиваются несколько раз, но они не должны повторяться.

20.10. Как отсортировать данные? Например, список персонажей по алфавиту, или набор чисел от меньшего к большему.

20.11. Как сделать проценты?

20.12. Как решить задачу по поиску случайного набора слагаемых?

20.13. Как разредить текст пробелами?

20.14. Как сделать записную книжку в игре?

20.15. Как сделать так, чтобы на локацию можно было зайти только один раз?

20.16. Как заставить действия выводиться в нужном мне порядке?

20.17. Как сделать в игре книгу? Чтобы её можно было взять и потом прочитать?

20.18. Как сделать склад, сундук, тайник, место, в котором можно выкладывать и хранить предметы?

20.19. Как сделать выпадение случайного действия на локации?

20.20. Как сделать перемещение на случайную локацию?

20.21. Как сделать случайный предмет?

20.22. Как узнать, какие переменные есть в игре? Может для этого есть специальная команда?

20.23. Как убрать преформатирование из HTML-разметки?

Источники и дополнительные материалы

21. Вопросы по Quest Generator (v.4.0.0.Beta)

21.1. Мне часто приходится вставлять одинаковые или почти одинаковые кусочки кода. Как автоматизировать этот процесс?

21.2. Делаю преформатирование пробелами, чтобы появлялась вертикальная полоска, так нагляднее. Нет ли какой-то комбинации клавиш, чтобы не тыкать пробел по пять раз?

21.3. Как свернуть кусочек кода, написанный под комментарием? В идеале, чтоб остался один только комментарий.

Источники и дополнительные материалы

22. Вопросы о Quest Navigator (v.0.0.28)

22.1. Пишу несколько игр в Quest Navigator. Как сделать, чтобы у каждой игры было собственное оформление?

22.2. Как подключить свой шрифт к игре?

22.3. Пишу <strong>bcolor=rgb(255,200,200)</strong>, но это не меняет цвет фона игры. Как изменить цвет фона из кода QSP?

22.4. Хочу прописать игре собственный вид курсора, как это сделать?

22.5. Скопировал шаблон оформления в папку со своей игрой, но что с ним теперь делать? Не пойму, что за что отвечает.

22.6. Как узнать, на каком плеере запущена игра, на классическом QSP, или на Quest Navigator?

22.7. Как вставить видео в игру на Навигаторе?

22.8. Как делать standalone-сборку на Навигаторе? | Независимая сборка на Quest Navigator

22.9. Где в Quest Navigator править размер окна с игрой? Например мне надо, чтобы игра изначально открывалась в разрешении 1280х720.

22.10. Как выполнить JavaScript прямо из кода QSP?

22.11. Инструкция посмене оформления из кода QSP?

Источники и дополнительные материалы

23. Ограничения

23.1. Видел в справке ограничение на 100 подключаемых файлов? Это что, я не смогу использовать более ста файлов картинок и музыки?

23.2. Хочу разместить на локации около 100 действий. Это вообще возможно?

23.3. Генерирую переменные с помощью оператора dynamic, и вдруг выходит ошибка 123. Что это, и как с этим бороться?

Источники и дополнительные материалы

24. Вопросы по работе с плеерами

24.1. Как сделать так, чтобы AeroQSP запускался прямо из Quest Generator?

24.2. Как сделать StandAlone-сборку на классическом плеере? | Можно ли сделать игру так, чтобы играть без плеера? | Как сделать пакетный файл запуска, чтобы игрок тыкал иконку start и сразу начинал играть?

Источники и дополнительные материалы

Зарезервированные слова, системные переменные, спецсимволы

Операции

Операторы

Функции

Системные переменные

Иные синтаксемы

Алфавитный указатель ключевых слов, спецсимволов, синтаксем

Источники и дополнительные материалы